package main

import (
	"fmt"
	"strconv"
)


// 通过 x.(type)根据具体类型执行不同的分支
// 有一定作用，但无法覆盖全部类型

func Sprint(x interface{}) string {
	type stringer interface {
		String() string
	}
	switch y := x.(type) {
	case stringer:
		return y.String()
	case string:
		return y
	case int:
		return strconv.Itoa(y)
	case bool:
		if y {
			return "true"
		}
		return "false"
	default:
		return "???"
	}
}

func main() {
	str := Sprint(123)
	fmt.Print(str)
}
